package com.cy.factory;

/**
 * <br>@class: SimpleFactory
 * <br>@description: 工厂
 * <br>@author: cy
 * <br>@date: 2020-03-28 11:37:08
 * <br>@version: 1.0
 * <br>
 * <br>@since: (版本) 作者 时间 注释
 */
public class SimpleFactory {
    //定义一个用于创建对象的接口
//让子类决定实例化哪一个类
//工厂方法使得一个类的实例化延迟到子类
//场景：
    //当你不知道该使用对象的确切类型
    //当你希望为库或框架提供扩展其内部组件的方法
//目的：
    //将具体产品和创建者解耦
    //符合单一职责原则
    //符合开闭原则
    public static void main(String[] args) {
        CarFactory cf = new BenzCarFactory();
        Car car1 = cf.CreateCar();
        car1.init(100);
        car1.run(5);
        car1.endDriving();
        car1.init(1001);
        car1.run(3);
        car1.stop(2);
        car1.endDriving();
    }


}

interface Car {
    void init(int key);

    void run(int level);

    void stop(int level);

    void endDriving();
}

class BenzCar implements Car {
    int carkey = 1001;
    boolean init = false;

    @Override
    public void init(int key) {
        if (carkey == key) {
            init = true;
            System.out.println("启动");
        } else {
            System.out.println("无法启动");
        }
    }

    @Override
    public void run(int level) {
        if (init) {
            System.out.println("当前速度=" + level);
        } else {
            System.out.println("未启动");
        }
    }

    @Override
    public void stop(int level) {
        if (init) {
            System.out.println("减少速度到=" + level);
        } else {
            System.out.println("未启动");
        }

    }

    @Override
    public void endDriving() {
        stop(0);
        init = false;
        System.out.println("欢迎下次驾驶");
    }
}
//抽象工厂
abstract class CarFactory {
    abstract Car CreateCar();
}
//延伸到子类做具体实例化
class BenzCarFactory extends CarFactory {
    @Override
    Car CreateCar() {

        return new BenzCar();
    }
}